package app.utils {
    import app.debug.APPLog;

    import flash.display.BitmapData;
    import flash.display.DisplayObject;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;

    public final class SWFInfoTreeImageUtils {
        public function SWFInfoTreeImageUtils() {
        }

        private static var emptyBitmapData:BitmapData = new BitmapData(1, 1, true, 0);


        /**
         * 将Target的变形矩阵设置为初始矩阵及ScaleXY都为1 xy也都为0  用于在最终导出图时候进行Compare比较
         * 最初的图片均存入的原始尺寸,这样后续对该图片进行了缩放等操作也会Compare为相同的图片
         */
        public static function cacheDisplayObjectToBitmapWithNormalMatrix(_target:DisplayObject):BitmapData {
            var originalMatrix:Matrix = _target.transform.matrix;

            _target.transform.matrix = new Matrix();
            var bounds:Rectangle = _target.getBounds(_target);
            var bitmapData:BitmapData;

            var offsetX:int = Math.ceil(bounds.x);
            var offsetY:int = Math.ceil(bounds.y);

            if (bounds.width == 0 || bounds.height == 0) {
                bitmapData = emptyBitmapData;
            }
            else {
                bitmapData = new BitmapData(Math.ceil(bounds.width), Math.ceil(bounds.height), true, 0xFFFFFF);
                bitmapData.draw(_target, new Matrix(1, 0, 0, 1, -offsetX, -offsetY));
            }

            _target.transform.matrix = originalMatrix;

            return bitmapData;
        }


        public static function cacheDisplayObjectToBitmapData(_target:DisplayObject):BitmapData {
            if (_target.scaleX != 1 || _target.scaleY != 1) {
                APPLog.err("SWFInfoTreeImageUtils->CacheItem Scale!=1");
            }

            emptyBitmapData.dispose();
            var bounds:Rectangle = _target.getBounds(_target);
            var bitmapData:BitmapData;

            //因为要扫描MovieClip中的每一帧,所以在扫描期间不可以改变数据源的任何值(x,y,width,height,scale etc.)
            //只要改变后当前Mc就会被SWF抛弃 重新New出来一个新的Mc,这样就没法正确的读取每帧信息了。
            //在Cache函数中,因为需要Cache的为*最初的尺寸大小(scale=1)* 之前可以先将_target的Scale设置成1然后Cache完成后再设置回去
            //由于MovieClip的这个限制,现在只能由外部传入这个宽高(比较函数中有原始Mc的引用 所以可以知道原始宽高)

            var offsetX:int = Math.ceil(bounds.x);
            var offsetY:int = Math.ceil(bounds.y);

            if (bounds.width == 0 || bounds.height == 0) {
                APPLog.err("fond one empty bitmap , the symbol in FLA file maybe wrong, please check out!");
                bitmapData = emptyBitmapData;
            }
            else {
                bitmapData = new BitmapData(Math.ceil(_target.width), Math.ceil(_target.height), true, 0xFFFFFF);
                bitmapData.draw(_target, new Matrix(1, 0, 0, 1, -offsetX, -offsetY));
            }

            return bitmapData;
        }
    }
}
